Reference
  Area\Util.txt
  Util\Audio.txt
  Util\Party.txt
  Util\CommonDialog.txt
  Util\PartyStatusWindow.txt
End Reference

Import StdUtilLib
  Math = MathUtil
End Import

Procedure Main(startAt)

  Dim ac = Nothing

  RegisterCommonEventHandlers()
  
  SetZoneOfCastle(64, 64, 1, 1, 62, 62, ExitArea_Enter)

  ac = AddActor_MTStopped("GuardMan1", 30, 39, 0, [A_Soldier], ActorMotion.Down, GuardMan1_Contact)
  
  ac = AddActor_MTStopped("GuardMan2", 31, 39, 0, [A_Soldier], ActorMotion.Down, GuardMan2_Contact)
  
  ac = AddActor_MTStopped("GuardMan3", 32, 39, 0, [A_Soldier], ActorMotion.Down, GuardMan3_Contact)
  
  ac = AddActor_MTStopped("GuardMan4", 33, 39, 0, [A_Soldier], ActorMotion.Down, GuardMan4_Contact)

  ac = AddActor_MTZonedRandom("Uncle", 37, 7, 0, _
    33, 2, 0, 41, 12, 0, [A_Uncle], Uncle_Contact)
  
  ac = AddActor_MTZonedRandom("Worker1", 26, 27, 0, _
    22, 22, 0, 30, 32, 0, [A_Soldier], Worker1_Contact)
  
  ac = AddActor_MTZonedRandom("Worker2", 37, 27, 0, _
    33, 22, 0, 41, 32, 0, [A_Soldier], Worker2_Contact)
  
  ac = AddActor_MTZonedRandom("Worker3", 10, 31, 0, _
    8, 16, 0, 13, 46, 0, [A_Soldier], Worker3_Contact)
  
  ac = AddActor_MTZonedRandom("Worker4", 53, 31, 0, _
    50, 16, 0, 55, 46, 0, [A_Soldier], Worker4_Contact)

  ac = AddActor_MTStopped("RegMan", 26, 13, 0, [A_Soldier], ActorMotion.Down, Nothing)
  ac = AddStaticActor("RegManEve", 26, 14, 10, [A_Null], RegManEve_Contact)

  If startAt <> "OpeningStart" Then
    DoInsideWarp(startAt, SetEntrance(31, 62, 0, Direction.Up), False)
  Else
    RegisterEventHandler("OpeningStart", AS_OpeningStart)
    RaiseEvent("OpeningStart")
    DoInsideWarp(startAt, SetEntrance(31, 62, 0, Direction.Up), False)
  End If
  
  ChangeBGM(Music.Castle)
  PutAreaNameLabel()

  NotifyEntered()
  Idle(ProcessInput)
  NotifyExiting()

End Procedure

Procedure AS_OpeningStart()
  Dim p_name = [TheHero].Name + "："
  DoMsg(p_name, "（レナードさんは　どこだろう？）", _
    "（紫の鎧を着ているらしいけど……）")
End Procedure

Procedure ExitArea_Enter()
  Dim p_name = [TheHero].Name + "："
  If TestFlag("Pramarl_1") Then
    BeginOutsideWarp([Field], GetAreaObject().Tag)
  Else
    DoMsg(p_name, "（レナードさんを探さなきゃ……）")
    LetActorWalk([TheHero], Direction.Up)
  End If
End Procedure

Procedure GuardMan1_Contact()
  DoMsg("国王陛下は大変ご多忙である")
End Procedure

Procedure GuardMan2_Contact()
  DoMsg("この先は玉座の間である")
End Procedure

Procedure GuardMan3_Contact()
  DoMsg("陛下がお前などに　御用のあろうはずがない")
End Procedure

Procedure GuardMan4_Contact()
  DoMsg("帰れ")
End Procedure

Procedure Uncle_Contact()
  Dim p_name = [TheHero].Name + "："
  Dim q_name = "レナード："
  If TestFlag("Kaure_1") Then
    DoMsg(q_name, "渡して来てくれたか", _
      "ご苦労だったな")
  ElseIf TestFlag("Pramarl_1") Then
    DoMsg(q_name, "カウレはずっと北東にある", _
      "いったん　東のラブロに戻って", _
      "そこから北上するといいぞ")
  Else
    DoMsg(q_name, "ん？　" + [TheHero].Name + "じゃないか")
    DoMsg(p_name, "レナードさん　お久しぶりです", _
      "父から本を預かって来たんですが")
    DoMsg(q_name, "おお　ありがとう")
    Sleep(500)
    DoMsg(q_name, "ところであれだな", _
      [TheHero].Name + "も　もう１８になるんだって？")
    DoMsg(p_name, "はい")
    DoMsg(q_name, "パン屋を継ぐつもりなのか")
    DoMsg(p_name, "まあ　そのつもりです")
    DoMsg(q_name, "それも悪くないとおもうが", _
      "騎士もいいぞ　なにせ収入が安定しているからな")
    DoMsg(q_name, "まあ　それはおいといて")
    Sleep(500)
    DoMsg(q_name, "ちょっと遣いを頼まれてくれないか", _
      "急ぎの用じゃないんだが")
    DoMsg(p_name, "なんでしょう？")
    DoMsg(q_name, "ずっと北東にカウレという町がある", _
      "そこのモーガンという長老に", "この手紙を渡してほしい")
    DoMsg(p_name, "カウレあたりはモンスターも強いでしょう？")
    DoMsg(q_name, [TheHero].Name + "なら大丈夫さ", _
      "あのギュンターの息子なんだし")
    Sleep(500)
    DoMsg(q_name, "そんなに心配なら", _
      "この城でヒマにしている連中がいるから", _
      "連れて行ったらいいさ", _
      "ただし弱いからな　鍛えてやらないと")
    DoMsg(p_name, "わかりました　行きましょう")
    DoMsg(q_name, "引き受けてくれるか", _
      "じゃ　これは支度金とお礼", _
      MoneyStr(1000) + "でいいな？")
    Sleep(500)
    ReceiveMoney(1000)
    DoMsg(p_name, "ありがとうございます")
    DoMsg(q_name, "んじゃ　よろしく", _
      "いったん　東のラブロに戻って", _
      "そこから北上するといいぞ")
    SetFlag("Pramarl_1")
  End If
End Procedure

Procedure Worker1_Contact()
  If DoYesNoMsg("戦闘の知恵を授けようか？") Then
    DoMsg("敵の攻撃は強く　いかに高性能な防具でも", _
      "そのダメージをゼロにすることはできない", _
      "そこで生命力　つまりＨＰがモノを言ってくる", _
      "", _
      "常に十分な残量を確保しておくことだ", _
      "油断していると　あっという間にやられるぞ", _
      "逃げるにしても洞窟の中では難しい", _
      "広野なら非常に簡単だがな", _
      "また魔力　つまりＭＰの残量にも気をつけろ", _
      "洞窟の奥まで行きすぎて足りなくなったら", _
      "ＨＰを回復できなくなる", _
      "結果は分かるな？", _
      "あとダメージを確実に減らす唯一の手段は", _
      "身を守ることだ　ダメージが半分になるぞ", _
      "無闇に行動するよりも有効な時があるから", _
      "覚えておくように　以上だ")
  Else
    DoMsg("そうか　成長したな")
  End If
End Procedure

Procedure Worker2_Contact()
  If DoYesNoMsg("成長の知恵を授けようか？") Then
    DoMsg("武器を使って敵を攻撃すれば武器レベルが", _
      "何かしらの魔法を使えば魔法レベルが上がる", _
      "レベルに比例してその威力も増すだろう", _
      "だが　どちらか一方だけを鍛えるのは危険だ", _
      "というのも最大ＨＰは総合力に比例するのだ", _
      "つまり偏った鍛え方をしていては", _
      "最大ＨＰがなかなか上がらず", _
      "より強力な敵が現れた時に対応できなくなる", _
      "均等とは言わないが　もう一方もある程度", _
      "鍛えておくとバランスが良いだろう", _
      "", _
      "", _
      "それから武器や魔法には難易度がある", _
      "高価なものほど高いレベルが要求されるぞ", _
      "使用する者が未熟であれば", _
      "その効果を十分に発揮することはできない", _
      "身の丈に合ったものを使うことだ")
  Else
    DoMsg("そうか　成長したな")
  End If
End Procedure

Procedure Worker3_Contact()
  If DoYesNoMsg("金銭の知恵を授けようか？") Then
    DoMsg("お金は大事に使わなければならない", _
      "敵を倒して得られるお金は微々たるものだ", _
      "せいぜい宿屋代にしかならないだろう", _
      "", _
      "それでも洞窟に眠っているという宝箱には", _
      "もしかすると大金が入っているかも知れない", _
      "これは直感だが　全部で８０万ってところか", _
      "", _
      "とにかく装備や魔法を買う時には", _
      "本当によく考えて決めるべきだ", _
      "高い割には　今の装備品と大差ない場合もある", _
      "使い勝手の悪い魔法だってあるだろう", _
      "魔法中心の者には武器を買わないとか", _
      "防具は前衛を先に充実させるなど", _
      "色々工夫することだ")
  Else
    DoMsg("そうか　成長したな")
  End If
End Procedure

Procedure Worker4_Contact()
  If DoYesNoMsg("世界の知恵を授けようか？") Then
    DoMsg("この世界は　我々のいるクレノサ島と", _
      "その何倍も大きな大陸から成っている", _
      "大陸の南東側はサマオリア", _
      "北東側はアドルニアの領地だ", _
      "お前はラブロの者だったな　ここから東の", _
      "でもいちおう島の地理について説明しておこう", _
      "", _
      "", _
      "ラブロから北に行けばカウレがある", _
      "カウレの少し南には地下通路があって", _
      "そこを抜ければアドルニアに行けるぞ", _
      "", _
      "また東海岸を北上すればバムケイクがある", _
      "だが現在は崖崩れで通行止めになっている", _
      "復旧中だがどうしても今すぐ行きたいなら", _
      "山を貫通する洞窟を通るしかないな", _
      "バムケイクからさらに北に行けばソンテム", _
      "その近くには青龍の塔と呼ばれる塔がある", _
      "古代から存在するようだが", _
      "誰が何の目的で建てたのか　知る者はいない", _
      "まあこんなところか", _
      "あとは己の足で調べるがよい")
  Else
    DoMsg("そうか　成長したな")
  End If
End Procedure

Procedure SelectFighterParam(target)

  Dim p_left = 10

  Dim str_p = 0
  If DoYesNoMsg("力は強いほうがいいですか？") Then
    If DoYesNoMsg("すごく強いほうがいいですか？") Then
      str_p = 4
    Else
      str_p = 3
    End If
  Else
    If DoYesNoMsg("少しはあるほうがいいですか？") Then
      str_p = 2
    Else
      str_p = 1
    End If
  End If
  p_left -= str_p

  Dim vit_p = 0
  If DoYesNoMsg("体力はあるほうがいいですか？") Then
    If DoYesNoMsg("すごくあるほうがいいですか？") Then
      vit_p = 4
    Else
      vit_p = 3
    End If
  Else
    If DoYesNoMsg("少しはあるほうがいいですか？") Then
      vit_p = 2
    Else
      vit_p = 1
    End If
  End If
  p_left -= vit_p
  
  Dim int_p = 0
  If p_left >= 4 AndAlso DoYesNoMsg("魔力は強いほうがいいですか？") Then
    If p_left >= 5 AndAlso DoYesNoMsg("すごく強いほうがいいですか？") Then
      int_p = 4
    Else
      int_p = 3
    End If
  Else
    If p_left >= 3 AndAlso DoYesNoMsg("少しはあるほうがいいですか？") Then
      int_p = 2
    Else
      int_p = 1
    End If
  End If
  p_left -= int_p

  Dim agi_p = 0
  If p_left >= 3 AndAlso DoYesNoMsg("素早さはあるほうがいいですか？") Then
    If p_left >= 4 AndAlso DoYesNoMsg("すごくあるほうがいいですか？") Then
      agi_p = 4
    Else
      agi_p = 3
    End If
  Else
    If p_left >= 2 AndAlso DoYesNoMsg("少しはあるほうがいいですか？") Then
      agi_p = 2
    Else
      agi_p = 1
    End If
  End If
  p_left -= agi_p
  
  If p_left > 2 AndAlso str_p = 1 Then
    str_p += 1
    p_left -= 1
  End If
  If p_left > 2 AndAlso vit_p = 1 Then
    vit_p += 1
    p_left -= 1
  End If
  If p_left > 2 AndAlso int_p = 1 Then
    int_p += 1
    p_left -= 1
  End If
  If p_left > 2 AndAlso agi_p = 1 Then
    agi_p += 1
    p_left -= 1
  End If
  
  Dim dt_left = 7 + 2 + 3
  
  Dim str_r = Math.GetRandom(0, Math.Min(8, dt_left))
  Dim str = (20 + 8 * (str_p - 1) + str_r) / 2
  dt_left -= str_r
  
  Dim int_r = Math.GetRandom(Math.Max(0, dt_left - 7), Math.Min(8, dt_left))
  Dim int = (20 + 8 * (int_p - 1) + int_r) / 2
  dt_left -= int_r
  
  Dim vit_r = Math.GetRandom(Math.Max(0, dt_left - 5), Math.Min(3, dt_left))
  Dim vit = (30 + 3 * (vit_p - 1) + vit_r) / 2
  dt_left -= vit_r
  
  Dim agi_r = Math.GetRandom(Math.Max(0, dt_left - 3), Math.Min(3, dt_left))
  Dim agi = (30 + 3 * (agi_p - 1) + agi_r) / 2
  dt_left -= agi_r
  
  Dim luc_r = Math.GetRandom(Math.Max(0, dt_left), Math.Min(4, dt_left))
  Dim luc = (30 + 4 * p_left + luc_r) / 2
  
  Return {str, vit, int, agi, luc}
  
End Procedure

Procedure CreateFighter(target)

  Dim params = SelectFighterParam(target)

  If DoYesNoMsg("こんなんで　よろしいですか？", _
    "　　　力：" + params[1] + "　　　体力：" + params[2] + "　　　魔力：" + params[3], _
    "すばやさ：" + params[4] + "　運のよさ：" + params[5]) Then

    DoMsg("わかりました", "では次に　見た目について")
    Dim hero_type = 1
    If Not DoYesNoMsg("戦士系と魔術師系から選択できます", "戦士系がよろしいですか？") Then
      hero_type = 3
    End If
    If Not DoYesNoMsg("性別は男性と女性から選択できます", "男性がよろしいですか？") Then
      hero_type += 1
    End If
    
    DoMsg("最後に　呼び名を考えてください")
    Dim theName = ""
    Do
      theName = InputKatakana(theName, 8)
      If theName = Nothing Then
        If DoYesNoMsg("作成をキャンセルしますか？") Then Return
      End If
    Loop While theName <> Nothing AndAlso theName <> "" AndAlso Not DoYesNoMsg(theName + "さんでよろしいですか？")

    If theName <> Nothing Then
      target.Name = theName
      target.Type = hero_type
      If hero_type = 1 Then
        target.Texture = [T_H04]
      ElseIf hero_type = 2 Then
        target.Texture = [T_H07]
      ElseIf hero_type = 3 Then
        target.Texture = [T_H10]
      Else
        target.Texture = [T_H13]
      End If
      target.BaseStrength = params[1]
      target.BaseVitality = params[2]
      target.BaseIntelligence = params[3]
      target.BaseAgility = params[4]
      target.BaseLuck = params[5]
      target.Strength = target.BaseStrength
      target.Vitality = target.BaseVitality
      target.Intelligence = target.BaseIntelligence
      target.Agility = target.BaseAgility
      target.Luck = target.BaseLuck
      target.MaxHP = target.Vitality
      target.HP = target.MaxHP
      target.MaxMP = target.Intelligence
      target.MP = target.MaxMP
      Return True
    Else
      Return False
    End If
  Else
    Return False
  End If

End Procedure

Procedure RegManEve_Contact(theActor)

  DoMsg("ここは戦士登録所です")

  Dim fighters = {[Fighter1], [Fighter2], [Fighter3], [Fighter4], [Fighter5], [Fighter6]}
  Dim hMenu = CreateMenu(0, 0, 240, 120, Nothing, Nothing, "どうする？", _
    {"仲間を登録", "パーティーに入れる", "パーティーから外す"}, Nothing, 1)
  Dim menu_index = ProcessMenu(hMenu)
  Do While menu_index > 0
    If menu_index = 1 Then
      If fighters[fighters.Count].Name = "" Then
        For i = 1 To fighters.Count
          If fighters[i].Name = "" Then
            DoMsg("あと " + (fighters.Count - i + 1) + " 人登録できます")
            If CreateFighter(fighters[i]) = True Then
              DoMsg(fighters[i].Name + "さんを登録しました。")
            End If
            Exit For
          End If
        Next
      Else
        DoMsg("これ以上登録できません")
      End If
    ElseIf menu_index = 2 Then
      If [Party].Member.Count <= 3 Then
        Dim not_in_party = CreateList()
        For i = 1 To fighters.Count
          If fighters[i].Name <> "" AndAlso Not [Party].Member.Contains(fighters[i]) Then
            not_in_party.Add(fighters[i])
          End If
        Next
        If not_in_party.Count > 0 Then
          Dim adden_menu = CreateNameListBox(not_in_party, 120, 0, 240, 240, _
            Nothing, Nothing, "誰を？", 1)
          Dim adden_index = ProcessMenu(adden_menu)
          If adden_index > 0 Then
            DoMsg(not_in_party[adden_index].Name + "さんが入ります。")
            AddPartyMember(not_in_party[adden_index])
          End If
          DestroyControl(adden_menu)
        Else
          DoMsg("だれも登録されていません")
        End If
      Else
        DoMsg("これ以上追加できません")
      End If
    Else
      If [Party].Member.Count > 1 Then
        Dim in_party = CombineList(GetPartyMembers())
        in_party.Remove([TheHero])
        Dim removed_menu = CreateNameListBox(in_party, 120, 0, 240, 240, _
          Nothing, Nothing, "誰を？", 1)
        Dim removed_index = ProcessMenu(removed_menu)
        If removed_index > 0 Then
          DoMsg(in_party[removed_index].Name + "さんが外れます。")
          RemovePartyMember(in_party[removed_index])
        End If
        DestroyControl(removed_menu)
      Else
        DoMsg("これ以上外せません")
      End If
    End If
    menu_index = ProcessMenu(hMenu)
  Loop
  DestroyControl(hMenu)

End Procedure
